import {API_BASE_URL} from "@/env_config.js"


// 同时发送异步代码的次数
let ajaxTimes=0;
/**
 * params是一个对象,和文档里面一模一样
 * 包含 url, header，data，method，timeout
 */
const request=(params)=>{
  // 判断 url中是否带有 /my/ 请求的是私有的路径 带上header token
  let header={...params.header};
  
  // if(params.url.includes("/user/")){
  //   // 拼接header 带上token
  //   header["Authorization"]=uni.getStorageSync("token");
  // }

  ajaxTimes++;
  // 显示加载中 效果
  uni.showLoading({
    title: "登录中",
    mask: true
  });
    
  
  // 定义公共的url      /************* */
  // 开发地址 http://222.19.236.169:9999
  // 部署地址 https://mgy.cutebyte.top
  const baseUrl=API_BASE_URL  //"http://222.19.236.169:9999"; 
  return new Promise((resolve,reject)=>{
    uni.request({
     ...params,
     header:header,
     url:baseUrl+params.url,
     success:(result)=>{
       resolve(result);  /************* */
     },
     fail:(err)=>{
       reject(err);
     },
     complete:()=>{
      ajaxTimes--;
      if(ajaxTimes===0){
        //  关闭正在等待的图标
        uni.hideLoading();
      }
     }
    });
  })
}


const base64Encode = (input) => {
    const chars = 'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/';
    let str = input.toString(); // 将数字转换为字符串
    let output = '';

    // 将字符串转换为二进制数据
    for (let i = 0; i < str.length; i++) {
        output += str.charCodeAt(i).toString(2).padStart(8, '0');
    }

    // 将二进制分为 6 位一组，编码为 Base64
    let base64 = '';
    for (let i = 0; i < output.length; i += 6) {
        const segment = output.slice(i, i + 6).padEnd(6, '0');
        base64 += chars[parseInt(segment, 2)];
    }

    // 补充 = 符号
    while (base64.length % 4 !== 0) {
        base64 += '=';
    }

    return base64;
};

// 测试
const num = 'pig:pig'
console.log("测试客户端密钥base64输出",base64Encode(num)); // 输出: 



import {LocalStorage} from '@/utils/storage';
import {validateNull} from '@/utils/validate';
// import {useUserInfo} from '@/stores/userInfo';
import other from '@/utils/other';

/**
 * https://www.ietf.org/rfc/rfc6749.txt
 * OAuth 协议 4.3.1 要求格式为 form 而不是 JSON 注意！
 */
const FORM_CONTENT_TYPE = 'application/x-www-form-urlencoded';

/**
 * 登录后端 密码模式使用的客户端密钥 不同的客户端密钥(支持的oauth登录模式不一样，后台处理逻辑也会有区别，使用哪一种登录模式就要选择对应的客户端密钥)
 */
const OAUTH2_PASSWORD_CLIENT='client:client'

/**
 * 前端加密密钥
 */
const PWD_ENC_KEY='thanks,pig4cloud'


/**
 * 登录
 * @param data
 */
export const login = (data) => {
	// 客户端登录模式（看后端写了哪几种就用哪几种)
	const grant_type = 'password';
	const scope = 'server';
	
	
    const basicAuth = 'Basic ' + base64Encode(OAUTH2_PASSWORD_CLIENT);
    // Session.set('basicAuth', basicAuth);
	LocalStorage.set('basicAuth', basicAuth);
    let encPassword = data.password;
    // 密码加密
    if (PWD_ENC_KEY) {
        encPassword = other.encryption(data.password, PWD_ENC_KEY);
    }
    return request({
        url: '/admin/oauth2/token',
        method: 'post',
        data: {...data, password: encPassword, grant_type, scope},
        header: {
            skipToken: true,
            Authorization: basicAuth,
            'Content-Type': FORM_CONTENT_TYPE,
        },
    });
};


export const refreshTokenApi = (refresh_token) => {
    const grant_type = 'refresh_token';
    const scope = 'server';
    // 获取当前选中的 basic 认证信息
    const basicAuth = LocalStorage.get('basicAuth');

    return request({
        url: '/admin/oauth2/token',
        header: {
            skipToken: true,
            Authorization: basicAuth,
            'Content-Type': FORM_CONTENT_TYPE,
        },
        method: 'post',
        data: {refresh_token, grant_type, scope},
    });
};


/**
 * 调用刷新token的方法
 */
const refreshToken=()=>{
	return new Promise((resolve, reject) => {
					const refreshToken = LocalStorage.get('refresh_token');
					console.log("refreshTokenAPI之前",refreshToken)
					refreshTokenApi(refreshToken)
						.then((res) => {
							console.log("refresh结果",res)
							// 存储token 信息
							LocalStorage.set('token', res.data.access_token);
							LocalStorage.set('refresh_token', res.data.refresh_token);
							resolve(res);
						})
						.catch((err) => {
							uni.showToast({
								title: err.msg
							})
							reject(err);
						});
				});
}
// 调用测试
// refreshToken()

/**
 * 校验令牌，若有效期小于半小时自动续期
 * 
 * 最后一个是token没有过期的回调函数 可以不传递,unExpiresCallBackArg是回调函数参数
 * @param refreshLock
 */
export const checkToken = (refreshTime, refreshLock, app , clearRefreshToken, unExpiresCallBack,...unExpiresCallBackArg) => {

	 try{
	 	// 尝试执行的代码
	 	// 如果这里抛出异常，控制权会立即转移到 catch 块
	 	const basicAuth = LocalStorage.get('basicAuth');
	 	
	 	request({
	 	    url: '/admin/token/check_token',
	 	    header: {
	 	        skipToken: true,
	 	        Authorization: basicAuth,
	 	        'Content-Type': FORM_CONTENT_TYPE,
	 	    },
	 	    method: 'get',
	 	    data: {token: LocalStorage.getToken()},
	 	})
	 	    .then((response) => {
	 	        if (validateNull(response.data) || response.data.code === 1) {
	 				console.log('请求checktoken之后失败，获取到的response.data为空,清空refreshToken,重新登录')
	 				console.log(response)
	 	            // clearInterval(refreshTime);
	 				clearRefreshToken(app);
	 	            return;
	 	        }
	 			console.log("checkData",response)
	 	        // const expire = Date.parse(response.data.expiresAt); //如果 expiresAt 是时间戳，直接使用 response.data.expiresAt
	 			const expire = response.data.expiresAt;
	 			console.log(expire)
	 	        if (expire) {
	 				console.log("expire不为空")
	 				console.log(new Date())
	 				console.log(new Date(expire)) //.toUTCString()会使用uTC时区打印,UTC是非中国的时区
	 	            const expiredPeriod = expire - new Date().getTime();
	 				console.log(expiredPeriod)
	 				console.log(app)
	 	            //小于半小时自动续约
	 	            if (expiredPeriod <= 30 * 60 * 1000) {
	 	                if (!app.globalData.refreshLock) {
	 						console.log("需要续约")
	 	                    app.globalData.refreshLock = true;
	 	                    refreshToken()
	 	                    .catch((err) => {
	 							console.log('请求checktoken之后失败，refreshToken失败,清空refreshToken,重新登录')
	 							console.log(err)
	 	                        // clearInterval(refreshTime);
	 							clearRefreshToken(app);
	 	                    }).finally(()=>{
	 							app.globalData.refreshLock = false;
	 						})
	 	                    // app.globalData.refreshLock = false;
	 	                }
	 	            }
	 				
	 				// 说明token没有过期执行回调函数
	 				console.log(("请求checkToken后发现没有过期"))
	 				if(unExpiresCallBack){
	 					console.log("执行回调")
	 					unExpiresCallBack(...unExpiresCallBackArg)
	 				}
	 	        }
	 			else{
	 				console.log('请求checktoken之后失败，获取到的expire为空,清空refreshToken,重新登录')
	 				console.log(response)
	 				// 清楚refreshToken (说明登录过期)
	 				clearRefreshToken(app);
	 			}
	 			
	 	    })
	 	    .catch((err) => {
	 			console.log('请求checktoken之后失败，promiseError,清空refreshToken,重新登录')
	 			console.log(err)
	 	        // 发生异常关闭定时器
	 	        // clearInterval(refreshTime);
	 			clearRefreshToken(app);
	 	    });
	 }catch(er){
		 console.log('请求checktoken之前失败，清空refreshToken,重新登录')
		 console.log(er)
	 	//TODO handle the exception
		clearRefreshToken(app)
	 }
    
    
};

// /**
//  * 获取用户信息
//  */
// export const getUserInfo = () => {
//     return request({
//         url: '/admin/user/info',
//         method: 'get',
//     });
// };

// export const logout = () => {
//     return request({
//         url: '/auth/token/logout',
//         method: 'delete',
//     });
// };
